iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
自我挑戰組

Hello SQL 初次見面你好系列 第 22

Day 22: PostgreSQL 中的 Table-Level Locks (表級鎖定)

  • 分享至 

  • xImage
  •  

在資料庫操作中,除了行級鎖定外,還有一種更廣泛的鎖定機制,稱為表級鎖定
當交易需要對整個資料表進行某些操作,如修改資料表結構或對多行數據進行讀/寫時,表級鎖定就派上了用場

什麼是表級鎖定?

表級鎖定,如其名,是鎖定整個資料表的機制
也就是說當一個交易對一個資料表進行鎖定時,其他交易可能無法對該資料表進行某些操作,直到鎖定模式被釋放

為什麼需要表級鎖定?

想像一下,如果你正在對一個大型的資料表進行結構修改,像是新增一個新欄位,而其他交易正在嘗試查詢或修改該資料表的數據。
如果沒有適當的鎖定機制,可能最後會導致資料不一致或其他未預期的結果

PostgreSQL 中的表級鎖定模式

1. ACCESS SHARE

  • 說明:這是最輕量級的鎖定模式,允許多個交易同時讀取資料表,但不允許結構性修改
  • 案例:假設你有一個線上圖書館,你想要允許多人同時瀏覽書籍列表,但不希望在此期間有人修改書籍的結構,如添加新的欄位
BEGIN;
LOCK TABLE books IN ACCESS SHARE MODE;
SELECT * FROM books;
COMMIT;

2. ROW SHARE

  • 說明:允許交易鎖定特定行進行修改,但不允許結構性的鎖定
  • 案例:你正在管理一個線上購物商店,希望員工能夠更新產品的庫存數量,但同時不希望他們修改產品的結構
BEGIN;
LOCK TABLE products IN ROW SHARE MODE;
UPDATE products SET stock = stock - 1 WHERE product_id = 5;
COMMIT;

3. ROW EXCLUSIVE

  • 說明:允許交易修改資料,但不允許其他交易進行結構性的鎖定或進行資料修改
  • 案例:你正在進行一次大型的促銷活動,想要一次性更新所有產品的價格,但不希望在此過程中有其他人也修改價格或進行結構性的更改
BEGIN;
LOCK TABLE products IN ROW EXCLUSIVE MODE;
UPDATE products SET price = price * 0.9 WHERE discount = TRUE;
COMMIT;

4. SHARE UPDATE EXCLUSIVE

  • 說明:用於預防其他交易進行結構性的更改,並允許行級鎖定
  • 案例:你想要確保資料表的結構在進行一些重要操作時不會被更改,例如在進行資料遷移或資料清理時
BEGIN;
LOCK TABLE orders IN SHARE UPDATE EXCLUSIVE MODE;
-- 這邊的操作不能更改資料表結構
COMMIT;

5. SHARE

  • 說明:防止其他交易修改資料表,但允許行級鎖定和查詢
  • 案例:你正在進行資料的年度審查,希望在此期間不會有新的資料被加入或修改,但仍允許員工查詢資料
BEGIN;
LOCK TABLE customers IN SHARE MODE;
SELECT * FROM customers WHERE review_status = 'pending';
COMMIT;

6. SHARE ROW EXCLUSIVE

  • 說明:允許交易修改資料表,但不允許其他交易查詢或進行其他修改
  • 案例:你想要進行資料表的大規模更新,例如將所有客戶的信用等級進行調整,但不希望在此過程中有其他人查詢或修改資料
BEGIN;
LOCK TABLE customers IN SHARE ROW EXCLUSIVE MODE;
UPDATE customers SET credit_rating = 'A' WHERE purchase_history > 1000;
COMMIT;

7. EXCLUSIVE

  • 說明:允許交易查詢資料表,但不允許其他交易進行任何其他操作
  • 案例:你想要對資料表進行備份,希望確保在此過程中,除了查詢外,不會有其他操作
BEGIN;
LOCK TABLE orders IN EXCLUSIVE MODE;
-- 這邊進行備份操作
COMMIT;

8. ACCESS EXCLUSIVE

  • 說明:完全鎖定資料表,不允許任何其他交易進行任何操作。
  • 案例:你正在對資料表進行結構性的大修改,例如合併多個欄位或刪除多個欄位,希望確保沒有其他交易可以接觸到這個資料表。
BEGIN;
LOCK TABLE users IN ACCESS EXCLUSIVE MODE;
ALTER TABLE users DROP COLUMN old_data;
COMMIT;

上一篇
Day 21: PostgreSQL 中的 Row-Level Locks (行鎖定)
下一篇
Day 23 什麼是 NoSQL
系列文
Hello SQL 初次見面你好30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言